package com.ply.flashsalessystem.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ply.flashsalessystem.entity.dto.login.ManagerLoginDto;
import com.ply.flashsalessystem.entity.dto.login.UserLoginDto;
import com.ply.flashsalessystem.entity.pojo.Manage;
import com.ply.flashsalessystem.entity.pojo.Store;
import com.ply.flashsalessystem.entity.pojo.User;
import com.ply.flashsalessystem.entity.result.Result;
import com.ply.flashsalessystem.service.ManageService;
import com.ply.flashsalessystem.service.StoreService;
import com.ply.flashsalessystem.service.UserService;
import com.ply.flashsalessystem.utils.JWTUtil;
import com.ply.flashsalessystem.utils.RuleUtils;
import com.ply.flashsalessystem.utils.Type;
import com.ply.flashsalessystem.utils.UserUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.List;
import java.util.Objects;

/**
 * @author XiaoPan
 * date: 2022/3/24 14:01
 * <p>
 * action:
 */
@Slf4j
@RestController
@RequestMapping("/login")
@CrossOrigin
@Api("登录 注册 接口")
public class LoginController {

    @Autowired
    UserService userService;

    @Autowired
    StoreService storeService;

    @Autowired
    ManageService manageService;

    @PostMapping("user")
    @ApiOperation("用户登录 用户名 为iphone ")
    public Result userLogin(@RequestBody UserLoginDto userLoginDto) {
        String iphone = userLoginDto.getIphone();
        String pwd = userLoginDto.getPwd();
        log.info("iphone:{}, pwd:{}", iphone, pwd);
        if ("".equals(iphone) ||
                iphone == null ||
                "".equals(pwd) ||
                pwd == null) {
            return Result.error().message("用户名密码错误");
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("iphone", iphone);
        queryWrapper.eq("pwd", pwd);
        List<User> list = userService.list(queryWrapper);
        if (list.isEmpty()) {
            return Result.error();
        }
        User user1 = list.get(0);

        UserUtils.addUserUtils(user1.getUserId(), user1.getUserName(), Type.TYPE_USER);

        String token = addNewToken();
        return Result.ok().data("token", token);
    }

    @PostMapping("store")
    @ApiOperation("小店登录")
    public Result storeLogin(@RequestBody ManagerLoginDto managerLoginDto) {
        String name = managerLoginDto.getName();
        String pwd = managerLoginDto.getPwd();
        if ("".equals(name) ||
                name == null ||
                "".equals(pwd) ||
                pwd == null) {
            return Result.error();
        }
        QueryWrapper<Store> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("sname", name);
        queryWrapper.eq("pwd", pwd);

        List<Store> list = storeService.list(queryWrapper);
        if (list.isEmpty()) {
            return Result.error();
        }

        Store store1 = list.get(0);

        UserUtils.addUserUtils(store1.getStoreId(), store1.getSname(), Type.TYPE_STORE);

        log.info("用户:{} 登陆成功", UserUtils.getUserName());

        addNewToken();
        return Result.ok();
    }

    @PostMapping("admin")
    @ApiOperation("管理员登录")
    public Result manageLogin(@RequestBody ManagerLoginDto managerLoginDto) {
        String name = managerLoginDto.getName();
        String pwd = managerLoginDto.getPwd();
        if ("".equals(name) ||
                name == null ||
                "".equals(pwd) ||
                pwd == null) {
            return Result.error();
        }

        QueryWrapper<Manage> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("name", name);
        queryWrapper.eq("pwd", pwd);

        List<Manage> list = manageService.list(queryWrapper);
        if (list.isEmpty()) {
            return Result.error();
        }
        Manage manage1 = list.get(0);

        UserUtils.addUserUtils(Long.valueOf(manage1.getManageId()), manage1.getName(), Type.TYPE_ADMIN);

        String token = addNewToken();

        return Result.ok().data("token", token);
    }


    @PostMapping("register/{storeId}")
    @ApiOperation("用户注册")
    @Transactional
    public Result register(@RequestBody User user,
                           @PathVariable(required = false) Long storeId) {

        // 为空 判断
        if (!StringUtils.hasText(user.getIphone())) {
            return Result.error().message("电话不能为空");
        }
        if (!StringUtils.hasText(user.getUserName())) {
            return Result.error().message("用户名不能为空");
        }
        if (!StringUtils.hasText(user.getPwd())) {
            return Result.error().message("密码不能为空");
        }
//        规则判断
        if (!RuleUtils.iphonePattern(user.getIphone())) {
            return Result.error().message(RuleUtils.iphoneError);
        }
        if (!RuleUtils.userName(user.getUserName())) {
            return Result.error().message(RuleUtils.nameError);
        }
        if (!RuleUtils.pwdPattern(user.getPwd())) {
            return Result.error().message(RuleUtils.pwdError);
        }

        //  注册时 是否 需要 当时给 还是 过后 给店家钱
        //  这里可以添加 不允许注册的 条件
        //todo  可以使用正则优化 注册 过滤敏感词
        if (storeId != null) {
            Store byId = storeService.getById(storeId);
            if (byId != null) {
                user.setStoreId(storeId);
                //给 商家 加钱
                storeService.InvitedUserGetAmount(storeId);
            } else {
                return Result.error().message("邀请码错误");
            }
        }

        //判断 name iphone 是否 存在
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name", user.getUserName());
        if (userService.getOne(queryWrapper) != null) {
            throw new RuntimeException("name 已存在");
        }
        queryWrapper.clear();
        queryWrapper.eq("iphone", user.getIphone());
        if (userService.getOne(queryWrapper) != null) {
            throw new RuntimeException("iphone 已存在");
        }

        return userService.save(user)
                ? Result.ok().message("注册成功")
                : Result.error().message("注册失败");
    }



    /**
     * 新增 小店 注册  转移到 管理员 中
     */
//    @ApiOperation("商家注册")
//    @PostMapping("addStore")
//    public Result addStore(@RequestBody Store store
//    ) {
//        String name = store.getSname();
//        String pwd = store.getPwd();
//        String iphone = store.getIphone();
//
//        //todo  可以使用正则优化 注册
//        if (!RuleUtils.userName(name)) {
//            return Result.error().message(RuleUtils.nameError);
//        }
//
//        if (!RuleUtils.pwdPattern(pwd)) {
//            return Result.error().message(RuleUtils.pwdError);
//        }
//
//        if (!RuleUtils.iphonePattern(iphone)) {
//            return Result.error().message(RuleUtils.iphoneError);
//        }
//
//
//        //todo 判断用户名 或者 iphone 是否存在
//        QueryWrapper<Store> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("sname",name).or().eq("iphone",iphone);
//        Store one = storeService.getOne(queryWrapper);
//        //可以注册
//        if (one != null){
//            return Result.error().message("name 重复 或者 电话重复");
//        }
//
//        Store manage = new Store();
//        manage.setSname(name);
//        manage.setPwd(pwd);
//        manage.setIphone(iphone);
//        return storeService.save(manage)
//                ? Result.ok().message("注册成功")
//                : Result.error().message("注册失败");
//    }



    private String addNewToken() {
        String newToken = JWTUtil.sign(UserUtils.getUserId(),
                UserUtils.getUserName(),
                UserUtils.getUserType());
        //设置响应头
        log.info("token: {}", newToken);
        Objects.requireNonNull(((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse()).setHeader("token", newToken);
        return newToken;
    }
}
